#include <stdio.h>
#include <string.h>
#include <math.h>


const MAXN=103;


typedef struct 
{
	double x,y;
}nod;

nod rat[MAXN];
nod hole[MAXN];

int n,m,k;

int map[MAXN][MAXN]; //存二部图的二维数组,有边则为1
int ans;			//存最大匹配方案数(也就是最小覆盖的点数)
int cx[MAXN],cy[MAXN],sx[MAXN],sy[MAXN];
//cx,cy:左右两边是否分配过.
//sx,sy:左右两边是否调整过.
int path(int u)
{
	int v;

	sx[u]=1;
	for (v=1;v<=m;v++)
		if (map[u][v]==1 && !sy[v]) //寻找一个相连的,且没有被调整过的点(注:可以是分配过的)
		{
			sy[v]=1;
			if ( !cy[v] || path(cy[v])) //如果右边的点没有分配过,或者分配了但是可以调整到其它边
			{
				cx[u]=v;
				cy[v]=u;
				return 1;
			}
		}
	return 0;
}


void solve()
{
	int i;
	memset(cx,0,sizeof(cx));
	memset(cy,0,sizeof(cy));
	ans=0;
	for (i=1;i<=n;i++)
		if (!cx[i])  //如果当前点没有分配与它对应的点，即开始试着分配。
		{
			memset(sx,0,sizeof(sx));
			memset(sy,0,sizeof(sy));
			ans+=path(i);     
		}


}



double s,v,dis;

int main()
{
	int i,j;
	double temp;
	while (scanf("%d%d%lf%lf", &n, &m, &s, &v)!=EOF)
	{
		memset(rat, 0, sizeof(rat));
		memset(hole, 0, sizeof(hole));
		memset(map, 0, sizeof(map));
		dis = s*v*s*v;
		for (i=1; i<=n; i++)
			scanf("%lf%lf", &rat[i].x, &rat[i].y);
		for (i=1; i<=m; i++)
			scanf("%lf%lf", &hole[i].x, &hole[i].y);
		for (i=1; i<=n; i++)
			for (j=1; j<=m; j++)
			{
				temp=(rat[i].x-hole[j].x)*(rat[i].x-hole[j].x)+(rat[i].y-hole[j].y)*(rat[i].y-hole[j].y);
				if (temp<dis || fabs(temp-dis)<1e-7 )
					map[i][j] = 1;
			}
/*		for (i=1;i<=n;i++)
		{
			for (j=1;j<=m;j++)
				printf("%d ",map[i][j]);
			printf("\n");
		}*/
		solve();
		printf("%d\n",n-ans);

		


				


		

	}


	
	return 0;
}